package com.edu.dto;

import com.alibaba.fastjson2.JSON;
import com.edu.utils.ReturnCode;

/**
 * 结果数据传输对象，用于封装操作结果和相关数据。
 *
 * @param <T> 泛型参数，表示返回的数据类型。
 */
public class ResultDto<T> {
    private int status;
    private String message;
    private T data;
    private String error;

    /**
     * 默认构造函数。
     */
    public ResultDto() {
    }

    /**
     * 完整构造函数。
     *
     * @param status  操作状态码。
     * @param message 操作信息，可以是成功信息或错误描述。
     * @param data    操作返回的数据。
     * @param error   错误详细信息，如果操作成功，则为null。
     */
    public ResultDto(int status, String message, T data, String error) {
        this.status = status;
        this.message = message;
        this.data = data;
        this.error = error;
    }

    /**
     * 生成表示内部服务器错误的结果对象。
     *
     * @param internalServerError 内部服务器错误的详细信息。
     * @return 返回封装了错误信息的ResultDto对象。
     */
    public static Object error(String internalServerError) {
        return null;
    }

    /**
     * 生成表示操作成功的ResultDto对象，并将其转换为JSON字符串。
     *
     * @param data 操作返回的数据。
     * @return 返回封装了成功信息和数据的JSON字符串。
     */
    public static <T> String success(T data) {
        ResultDto<T> result = new ResultDto<>(ReturnCode.SUCCESS.getCode(), "Operation successful.", data, null);
        return JSON.toJSONString(result);
    }

    /**
     * 生成表示操作失败的ResultDto对象，并将其转换为JSON字符串。
     *
     * @param code    操作失败的状态码。
     * @param message 操作失败的信息。
     * @return 返回封装了失败信息的JSON字符串。
     */
    public static <T> String fail(int code, String message) {
        ResultDto<T> result = new ResultDto<>(code, message, null, null);
        return JSON.toJSONString(result);
    }

    /**
     * 获取操作状态码。
     *
     * @return 返回操作状态码。
     */
    public int getStatus() {
        return status;
    }

    /**
     * 设置操作状态码。
     *
     * @param status 操作状态码。
     */
    public void setStatus(int status) {
        this.status = status;
    }

    /**
     * 获取操作信息，可以是成功信息或错误描述。
     *
     * @return 返回操作信息。
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置操作信息。
     *
     * @param message 操作信息。
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 获取操作返回的数据。
     *
     * @return 返回操作返回的数据。
     */
    public T getData() {
        return data;
    }

    /**
     * 设置操作返回的数据。
     *
     * @param data 操作返回的数据。
     */
    public void setData(T data) {
        this.data = data;
    }

    /**
     * 获取错误详细信息。
     *
     * @return 返回错误详细信息，如果操作成功，则为null。
     */
    public String getError() {
        return error;
    }

    /**
     * 设置错误详细信息。
     *
     * @param error 错误详细信息。
     */
    public void setError(String error) {
        this.error = error;
    }
}
